// 请求封装

import axios from 'axios'
import {RequestInfo} from '@/utils/type'
// 获取token
const token = localStorage.getItem('token')
const baseURL = 'http://localhost:3001/api/'
const apiURL = 'http://localhost:3000/api/'

// 创建axios实例
const instance = axios.create({
    baseURL,
    headers: {
        'Content-Type': 'application/json',
        'Authorization': `Bearer ${token}`
    },
    timeout: 5000 // 设置默认超时时间为5秒
})

// 请求拦截器
instance.interceptors.request.use(
    config => {
        // 在请求开始时显示 loading
        return config
    },
    err => {
        // 在请求失败时隐藏 loading
        return Promise.reject(err)
    }
)

// 响应拦截器
instance.interceptors.response.use(response => {
    // 请求结束时隐藏 loading
    return response
}, err => {
    // 响应失败时隐藏 loading
    responseFailFn(err)
    return Promise.reject(err);
})

// 响应失败判断
const responseFailFn = (err: any) => {
    // 处理不同状态码的错误
    switch (err.response?.status) {
        case 401:
            localStorage.removeItem('token');
            window.location.href = '/login';
            break;
        case 403:
            console.error('权限不足');
            break;
        case 404:
            console.error('请求不存在');
            break;
        case 500:
            console.error('服务器错误');
            break;
        case 501:
            console.error('服务器未实现');
            break;
        case 502:
            console.error('网关错误');
            break;
        case 503:
            console.error('服务器不可用');
            break;
        case 504:
            console.error('网关超时');
            break;
        default:
            console.error('发生错误', err.message);
            break;
    }
    return Promise.reject(err);
};

// 网络连接检查
const isNetworkAvailable = () => {
    return window.navigator.onLine;
};

// 请求函数
const request = (config: { url: string; method: string; data?: any;[key: string]: any; }) => {
    // 允许额外的配置
    if (!isNetworkAvailable()) {
        console.error('网络连接不可用');
        return Promise.reject(new Error('网络连接失败'));
    }
    const { url, method, data, ...restConfig } = config;
    const requestOptions: RequestInfo = {
        url,
        method: method.toLowerCase(), // 转换为小写
        data,
        ...restConfig // 其他配置项，如timeout等
    };
    return instance(requestOptions);
};
// 多种请求
const requestBase = (config: { url: string; method: string; data?: any;[key: string]: any; }) => {
    // 更新 instance 的 baseURL
    instance.defaults.baseURL = baseURL;
    return request(config);
}
const requestApi = (config: { url: string; method: string; data?: any;[key: string]: any; }) => {
    // 更新 instance 的 baseURL
    instance.defaults.baseURL = apiURL;
    return request(config);
}
export {
    requestBase,
    requestApi
}